\chapter{需求分析}
\section{问题的提出}
在当前计算机专业教学过程中，学生需要上机操作，对学生程序设计作业的批改，有时还采用传统的手工作业，进而存在的问题主要有以下几点：\par
\begin{enumerate}
  \item 批改任务繁重，作业数量多，容易产生错误。\par
  对教师来说，学生每次提交的代码，教师都需要手动下载，编译运行，然后进行评分。这样的工作量大，容易出错，而且效率低下。\par
  对学生来说，由于教师批改作业的时间较长，学生无法及时了解自己的代码是否正确，也无法及时了解自己的代码是否符合要求。\par
  \item 评阅边界模糊，学习效果差。\par
  手工审阅代码带来的另一个弊端就是边界模糊，代码中的一点点细节问题就可能会导致逻辑错误，这样教师和学生都很难把握代码是否正确。\par
\end{enumerate}\par
为了解决这些问题，本文基于Spring Boot、VUE和Spring Clould微服务\citep{bib14}，在Java平台下设计了一个代码在线评测系统，该系统可以自动评测学生提交的代码，让教师和学生都能够及时了解代码的正确性，提高教学效率。\par
\section{系统的需求分析}
下面从角色和功能模块两个方面对系统的需求进行分析。\par
\subsection{系统的角色分析}
从角色的视角来看，系统可以分为三种类型的角色，分别是游客、学生以及教师角色。三种角色分别具有不同的功能。\par
\begin{enumerate}
  \item 游客用户\par
  游客是未登录的访问者，他们可以通过系统查看系统的题库列表和题目情况，但是不能使用系统的任何其他功能，想在题目界面提交代码需要注册登录。\par
  \item 学生用户\par
  游客可从注册页面直接注册成为学生用户。学生用户拥有所有前台功能，能够查看题库中的题目，并在题目详情页面提交代码，以检验其代码是否符合题目的要求。还可在提交列表中查看历史提交代码的评测状态。\par
  \item 教师用户\par
  教师是最高权限所有者，拥有所有前台功能和后台功能，可由学生用户身份升级而成，教师用户除有游客及学生用户的所有权限外，还可编辑题库题目内容，包括更改题库题目的描述内容、输入测试项列表以及输出测试项列表，并可浏览每个学生用户所提交的源代码。\par
\end{enumerate}\par
\subsection{系统的功能模块分析}
通过对在线代码评测系统的系统需求分析，将功能模块划分为4个服务，每个服务对应一个功能模块，包含用户管理服务、题库管理服务、代码管理服务和代码评测服务。\par
用户管理服务包含注册、登录、修改信息和退出登录；题库管理服务包含查看题目、上传题目、删除题目和修改题目；代码管理服务包含提交代码、查看历史提交记录和查看历史提交代码；代码评测服务是由系统根据用户提交的代码和题目实现自动评测。系统的功能结构图如图2.1所示。\par
\begin{figure}[H]
  \centering
  \includegraphics[width=0.8\textwidth]{Img/img3.4}
  \caption{功能结构图}
\end{figure}
游客用户仅能访问身份认证服务中的注册与登录功能，以及题库管理服务中的题目列表查看和题目详情查看功能。游客用户的UML用例图如图2.2所示。\par
\begin{figure}[H]
  \centering
  \includegraphics[width=0.8\textwidth]{Img/img2.1}
  \caption{游客用户用例图}
\end{figure}
学生用户能够利用身份认证服务中的退出登录功能、更新个人信息，以及代码管理服务中的代码提交、查看提交记录和查看代码等功能。学生用户的UML用例图如图2.3所示。\par
\begin{figure}[H]
  \centering
  \includegraphics[width=0.8\textwidth]{Img/img2.2}
  \caption{学生用户用例图}
\end{figure}
教师用户可以使用题库管理服务中的题目修改、题目增加和题目删除等功能。教师用户的UML用例图如图2.4所示。\par
\begin{figure}[H]
  \centering
  \includegraphics[width=0.8\textwidth]{Img/img2.3}
  \caption{教师用户用例图}
\end{figure}
下面对系统的功能模块进行详细的需求分析。\par
\begin{enumerate}
  \item 用户管理服务是在用户登录时核实其身份的功能，其主要功能包括用户注册、登录，以及修改用户信息等。\par
  \begin{enumerate}
    \item 用户登录\par
    当用户点击“登录”按钮，或是想进行某些不具备权限的操作时，将进入登录界面。输入正确的用户名及密码就可以登录。\par
    \item 用户注册\par
    若当前的访问者为游客，但需进行如提交代码等需要权限的操作，可在注册页面注册用户账号，在此过程中需填写用户名、密码及其他相关信息。注册成功后，用户将被赋予学生用户身份。用户注册后，可用所注册的账号和密码登录。\par
    \item 修改用户信息\par
    每位用户都拥有属于自己的基本资料，比如昵称和个人简介等，这些信息可以在用户中心进行更改。\par
  \end{enumerate}
  \item 题库管理服务\par
  题库管理涵盖了题目的增、删、改、查等功能，核心功能包括：题目列表及题目详情的查看，题目的上传、修改以及删除。\par
  \begin{enumerate}
    \item 题目查看\par
    所有用户均可查看题库中的题目列表，包括题目的题号、题目的标题、题目的标签等信息。还可查看特定题目的题目详情，包括题目的题面、题目的标签、题目的运行限制等信息。\par
    \item 题目上传\par
    教师用户能够编辑一道题目的相关信息，比如题目的描述、输入输出的例子、标签以及提示等内容后，将其上传到题库。
    \item 题目修改\par
    教师用户能够从题库中挑选出一道题，编辑这道题的相关信息，比如题目的描述、输入输出的例子、标签以及提示等内容。\par
    \item 题目删除\par
    教师用户可以从题库中选择一道题目删除。\par
  \end{enumerate}
  \item 代码管理服务\par
  代码管理服务负责保存和维护用户提交的代码，功能包括代码提交、查看历史提交记录和查看历史提交代码等。\par

  \begin{enumerate}
    \item 代码提交\par
    学生在题目详情页面提交代码后，系统会自动进行评测，评测结果会显示在代码提交记录里。\par
    \item 代码提交记录查看\par
    用户可以在提交列表查看所有人提交详情，包括通过状态，消耗 CPU时间，消耗内存等。但只能看到自己的代码。\par
    \item 代码查看\par
    用户可以在提交列表查看自己提交的代码内容。\par
  \end{enumerate}
  \item 代码评测服务\par
  代码评测服务是此项目的核心，包括代码编译、代码的沙盒运行、评测结果输出等功能。\par
  \begin{enumerate}
    \item 代码编译\par
    代码评测服务会对用户提交的代码进行编译，若编译通过，则会生成一个可执行的文件。\par
    \item 代码沙盒运行\par
    代码评测服务会将编译好的程序放入代码沙箱中运行，并输入若干组测试数据，最终代码沙箱返回输出给代码评测服务，代码沙箱的设置提供了一套隔离的环境，能有效防止用户提交的代码对服务器造成危害。\par
    \item 评测结果输出\par
    代码评测服务会将用户代码的输出与题目的标准输出逐个进行比对，根据比对的情况给出评测结果。\par
  \end{enumerate}
\end{enumerate}